package com.java.net;


import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;


public class net_Tomcat {
    /**核心线程数（池中线程数小于核心线程数时，每来一个请求都会创建一个新的线程）*/
    private static  int corePooLSize=8;
    /**最大线程数（当池中线程数已经达到8，并且队列中也满了，但是这些线程都在忙，又来了新的请求）
     * 此时要继续创建线程，但是最多为maxmumPoolSize*/
    private static  int maximumPookSize=256;
    /**线程空闲时间（请求并发过后，池中线程空闲了，假如长时间不被应用，他也是耗费资源，所以在一定的时间过后，可以释放一些线程）*/
    private static long keepAliveTime=60;
    /**时间单位*/
    private static TimeUnit unit=TimeUnit.SECONDS;
    /**阻塞队列
     * 当池中线程已经达到了corePoolSize这个值，并且这些线程都在忙，此时再有新的请求可以将任务暂时存放到这个队列中）*/
    private static BlockingQueue<Runnable> blockingQueue=new ArrayBlockingQueue<>(100);
    /**
     * 初始化一个线程池，通过线程池中的线程处理客户端的请求
     */
    private static ThreadPoolExecutor poolExecutor=
            new ThreadPoolExecutor(corePooLSize,maximumPookSize, keepAliveTime, unit, blockingQueue);
    public static void main(String[] args) throws IOException {
        //1.构建服务器对象(java中使用ServerSocket构建服务器对象）
        ServerSocket server = new ServerSocket(9999);//http://localhost:9999
        System.out.println("server start...");
        //2.等待客户端的连接（java中Socket代表客户端对象）
        while (true) {//这里使用无限循环表示可以处理客户端的多次请求

            Socket client = server.accept();//accept是一个阻塞式方法，用于等待客户端的连接）
            //获取网络中的输出流对象，基于输出流对象向客户端写数据
            poolExecutor.execute(new Runnable(){
                @Override
                public void  run(){
                    try {
                        OutputStream out = client.getOutputStream();
                        String data = "http/1.1 200 OK \n\r" +
                                "Content-Type: text/html;charset=utf-8 \n\r" +
                                "\n\r" +
                                "Hello Client Browser";
                        out.write(data.getBytes());
                        out.flush();
                        client.close();
                    } catch (Exception e){e.printStackTrace();}
                }
            } );
        }
    }
}

